const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');
const Jimp = require('jimp');
const ico = require('png-to-ico');

/**
 * 将PNG转换为ICO文件
 * @param {string} pngPath PNG文件路径
 * @param {string} icoPath ICO文件路径
 */
async function convertPngToIco(pngPath, icoPath) {
  try {
    console.log(`正在将PNG转换为ICO: ${pngPath} -> ${icoPath}`);
    
    // 检查PNG文件是否存在
    if (!fs.existsSync(pngPath)) {
      console.error(`错误: PNG文件不存在: ${pngPath}`);
      return false;
    }
    
    // 创建图标的多种尺寸
    const sizes = [16, 32, 48, 64, 128, 256];
    const pngFiles = [];
    
    // 读取原始图像
    const image = await Jimp.read(pngPath);
    
    // 创建临时目录
    const tempDir = path.join(__dirname, '..', 'temp_icons');
    if (!fs.existsSync(tempDir)) {
      fs.mkdirSync(tempDir);
    }
    
    // 创建各种尺寸的图像
    for (const size of sizes) {
      const resizedPath = path.join(tempDir, `icon_${size}.png`);
      await image.clone().resize(size, size).writeAsync(resizedPath);
      pngFiles.push(resizedPath);
    }
    
    // 确保icons目录存在
    const iconsDir = path.dirname(icoPath);
    if (!fs.existsSync(iconsDir)) {
      fs.mkdirSync(iconsDir, { recursive: true });
    }
    
    // 转换为ICO
    const buffer = await ico(pngFiles);
    
    // 写入ICO文件
    fs.writeFileSync(icoPath, buffer);
    
    // 清理临时文件
    for (const file of pngFiles) {
      fs.unlinkSync(file);
    }
    fs.rmdirSync(tempDir);
    
    console.log(`成功创建图标: ${icoPath}`);
    return true;
  } catch (err) {
    console.error('创建ICO文件时出错:', err);
    return false;
  }
}

/**
 * 安装MDZ文件图标
 */
async function installMdzIcon() {
  try {
    const installPath = path.join(__dirname, '..');
    const pngPath = path.join(installPath, 'src', 'MDZ.png');
    const icoPath = path.join(installPath, 'icons', 'MDZ.ico');
    
    // 检查PNG图标是否存在
    if (!fs.existsSync(pngPath)) {
      console.error(`错误: 图标文件不存在: ${pngPath}`);
      console.log('请确保src目录下有MDZ.png文件');
      return;
    }
    
    // 转换图标
    const iconCreated = await convertPngToIco(pngPath, icoPath);
    if (!iconCreated) {
      console.error('创建图标失败，无法继续安装');
      return;
    }
    
    // 读取注册表脚本
    const regPath = path.join(__dirname, 'register-mdz-icon.reg');
    if (!fs.existsSync(regPath)) {
      console.error(`错误: 注册表脚本不存在: ${regPath}`);
      return;
    }
    
    // 使用当前安装路径替换模板变量
    let regContent = fs.readFileSync(regPath, 'utf8');
    regContent = regContent.replace(/%MDZ_INSTALL_PATH%/g, 
      installPath.replace(/\\/g, '\\\\')); // 需要双重转义反斜杠
    
    // 保存修改后的注册表脚本
    const tempRegPath = path.join(installPath, 'temp_register.reg');
    fs.writeFileSync(tempRegPath, regContent);
    
    // 导入注册表
    console.log('正在安装文件关联...');
    exec(`regedit /s "${tempRegPath}"`, (error, stdout, stderr) => {
      // 删除临时文件
      fs.unlinkSync(tempRegPath);
      
      if (error) {
        console.error('导入注册表时出错:', error);
        console.log('请以管理员权限手动运行register-mdz-icon.reg文件');
        return;
      }
      
      console.log('MDZ文件图标安装成功!');
      console.log('现在.mdz文件将显示自定义图标。');
    });
  } catch (err) {
    console.error('安装过程中出错:', err);
  }
}

// 运行安装程序
installMdzIcon(); 